<?php

declare(strict_types=1);

namespace App\Helpers;

/**
 * Herramientas para URLs.
 */
class URL
{
    private const ENVARNAME = 'app.url';

    private static string $URL;

    private const QUERY_EVENT = 'event';

    /**
     * Elimina las diagonales de una URL.
     */
    public static function trimSlashes(string $URL): string
    {
        return trim($URL, '/');
    }

    /**
     * Establece la URL de la aplicación.
     */
    private static function setURL(string $URL): void
    {
        self::$URL = self::trimSlashes($URL);
    }

    /**
     * Obtiene la URL de la aplicación.
     */
    public static function getURL(): string
    {
        if (empty(self::$URL)) {
            self::setURL(Env::get(self::ENVARNAME));
        }

        return self::$URL;
    }

    /**
     * Construye una URL de la aplicación.
     */
    public static function site(string|array $uri): string
    {
        if (is_string($uri)) {
            $uri = explode('/', self::trimSlashes($uri));
        }

        array_unshift($uri, self::getURL());

        return implode('/', $uri);
    }

    /**
     * Construye una URL desde la base: public/
     */
    public static function base(string|array $uri): string
    {
        return preg_replace('/index\.php\/?/', '', self::site($uri));
    }

    /**
     * Obtiene el nombre del parámetro de la query del evento.
     */
    public static function getQueryEventName(): string
    {
        return self::QUERY_EVENT;
    }

    /**
     * Construye una URL con evento.
     */
    public static function event(string|array $uri, ?string $name = null, ?string $id = null): string
    {
        $URL = self::site($uri);

        isset($name) && $URL .= sprintf('?%s=%s', self::getQueryEventName(), $name);
        isset($id) && $URL .= '#'.$id;

        return $URL;
    }
}
